'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

// 判断两个对象是否相等
function objEquals(object1, object2) {
	for (var propName in object1) {
		if (object1.hasOwnProperty(propName) !== object2.hasOwnProperty(propName)) {
			return false;
		} else if (_typeof(object1[propName]) !== _typeof(object2[propName])) {
			return false;
		}
	}
	for (var _propName in object2) {
		if (object1.hasOwnProperty(_propName) !== object2.hasOwnProperty(_propName)) {
			return false;
		} else if (_typeof(object1[_propName]) !== _typeof(object2[_propName])) {
			return false;
		}
		if (!object1.hasOwnProperty(_propName)) {
			continue;
		}
		if (object1[_propName] instanceof Array && object2[_propName] instanceof Array) {
			if (objEquals(!object1[_propName], object2[_propName])) {
				return false;
			}
		} else if (object1[_propName] instanceof Object && object2[_propName] instanceof Object) {
			if (objEquals(!object1[_propName], object2[_propName])) {
				return false;
			}
		} else if (object1[_propName] !== object2[_propName]) {
			return false;
		}
	}
	return true;
}

new Vue({
	el: '#app',
	data: function() {
		return {
			specification: [
				// 	{
				// 	name: '颜色',
				// 	value: ['黑色', '白色', '蓝色']
				// },
			],
			// 提交数据格式
			productArray: [
				// {
				// 	productId: 0,
				// 	productSpec: {
				// 		'颜色': '黑色'
				// 	},
				// 	productNo: 'PRODUCTNO_0',
				// 	productStock: 0,
				// 	productPrice: 10,
				// },
				// {
				// 	productId: 0,
				// 	productSpec: {
				// 		'颜色': '白色'
				// 	},
				// 	productNo: 'PRODUCTNO_1',
				// 	productStock: 0,
				// 	productPrice: 0,
				// },
				// {
				// 	productId: 0,
				// 	productSpec: {
				// 		'颜色': '蓝色'
				// 	},
				// 	productNo: 'PRODUCTNO_2',
				// 	productStock: 0,
				// 	productPrice: 0,
				// }
			],
			// 用来存储要添加的规格属性
			addValues: [],
			// 默认商品编号
			defaultProductNo: 'PRODUCTNO_'
			// 批量设置相关
		};
	},
	computed: {
		// 所有sku的id
		stockSpecArr: function () {
			return this.productArray.map(function (item) {
				return item.productSpec;
			});
		}
	},
	methods: {
		// 提交
		submit: function () {
			var data = this.productArray;
			console.log(data);
		},
		// 添加规格项目
		addSpec: function () {
			if (this.specification.length < 10) {
				this.specification.push({
					name: '',
					value: []
				});
			}
		},

		// 删除规格项目
		delSpec: function (index) {
			this.specification.splice(index, 1);

			this.handleSpecChange('del');
		},

		// 添加规格属性
		addSpecTag: function (index) {
			var str = this.addValues[index] || '';
			if (!str.trim()) return; // 判空
			str = str.trim();
			var arr = str.split(/\s+/); // 使用空格分割成数组

			var newArr = this.specification[index].value.concat(arr);
			newArr = Array.from(new Set(newArr)); // 去重
			this.$set(this.specification[index], 'value', newArr);

			this.clearAddValues(index);

			this.handleSpecChange('add');
		},

		// 删除规格属性
		delSpecTag: function (index, num) {
			this.specification[index].value.splice(num, 1);

			this.handleSpecChange('del');
		},

		// 清空 addValues
		clearAddValues: function (index) {
			this.$set(this.addValues, index, '');
		},

		/*
    根据传入的属性值，拿到相应规格的属性
    @params
      specIndex 规格项目在 advancedSpecification 中的序号
      index 所有属性在遍历时的序号
  */
		getSpecAttr: function (specIndex, index) {
			// 获取当前规格项目下的属性值
			var currentValues = this.specification[specIndex].value;
			var indexCopy = void 0;

			// 判断是否是最后一个规格项目
			if (this.specification[specIndex + 1] && this.specification[specIndex + 1].value.length) {
				indexCopy = index / this.countSum(specIndex + 1);
			} else {
				indexCopy = index;
			}

			var i = Math.floor(indexCopy % currentValues.length);

			if (i.toString() !== 'NaN') {
				return currentValues[i];
			} else {
				return '';
			}
		},

		/*
    计算属性的乘积
    @params
      specIndex 规格项目在 advancedSpecification 中的序号
  */
		countSum: function (specIndex) {
			var num = 1;
			this.specification.forEach(function (item, index) {
				if (index >= specIndex && item.value.length) {
					num *= item.value.length;
				}
			});
			return num;
		},

		// 根据传入的条件，来判断是否显示该td
		showTd: function (specIndex, index) {
			// 如果当前项目下没有属性，则不显示
			if (!this.specification[specIndex]) {
				return false;

				// 自己悟一下吧
			} else if (index % this.countSum(specIndex + 1) === 0) {
				return true;
			} else {
				return false;
			}
		},

		/**
   * [handleSpecChange 监听标签的变化,当添加标签时；求出每一行的hash id，再动态变更库存信息；当删除标签时，先清空已有库存信息，然后将原有库存信息暂存到stockCopy中，方便后面调用]
   * @param  {[string]} option ['add'|'del' 操作类型，添加或删除]
   * @return {[type]}        [description]
   */
		handleSpecChange: function (option) {
			var stockCopy = JSON.parse(JSON.stringify(this.productArray));
			if (option === 'del') {
				this.productArray = [];
			}

			for (var i = 0; i < this.countSum(0); i++) {
				this.changeStock(option, i, stockCopy);
			}
		},

		/**
   * [根据规格，动态改变库存相关信息]
   * @param  {[string]} option    ['add'|'del' 操作类型，添加或删除]
   * @param  {[array]} stockCopy [库存信息的拷贝]
   * @return {[type]}           [description]
   */
		changeStock: function (option, index, stockCopy) {
			var vm = this;
			var childProduct = {
				productId: 0,
				productSpec: this.getProductSpec(index),
				productNo: this.defaultProductNo + index,
				productStock: 0,
				productPrice: 0
			};

			var spec = childProduct.productSpec;
			if (option === 'add') {
				if (this.stockSpecArr.findIndex(function (item) {
					return objEquals(spec, item);
				}) === -1) {
					this.$set(this.productArray, index, childProduct);
				}
			} else if (option === 'del') {
				// 因为是删除操作，理论上所有数据都能从stockCopy中获取到
				var origin = '';
				stockCopy.forEach(function (item) {
					if (objEquals(spec, item.productSpec)) {
						origin = item;
						return false;
					}
				});
				this.productArray.push(origin || childProduct);
			}
		},

		// 获取productArray的productSpec属性
		getProductSpec: function (index) {
			var _this = this;

			var obj = {};
			this.specification.forEach(function (item, specIndex) {
				obj[item.name] = _this.getSpecAttr(specIndex, index);
			});
			return obj;
		},

		// 生成不重复的商品编号
		makeProductNoNotRepet: function (index) {
			var No = void 0;
			var i = index;
			var isRepet = true;
			while (isRepet) {
				No = this.defaultProductNo + i;
				isRepet = this.isProductNoRepet(No);
				i++;
			}
			return No;
		},

		// 商品编号判重
		isProductNoRepet: function (No) {
			var result = this.productArray.findIndex(function (item) {
				return item.productNo === No;
			});
			return result > -1;
		}
	}
});